package PictureGame;

import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.security.Key;
import java.util.Objects;
import java.util.Random;

public class gameJframe  extends JFrame implements KeyListener, ActionListener {
    //        创建一个二维数组
    int[][] data=new int[4][4];
//    记录空白方块的位置
    int x=0;
    int y=0;
//   定义一个变量来存储当前图片的路径,优化查看
    String path="E:\\Java\\demo2\\image\\animal\\animal2\\";

//    定义一个二维数组，存储正确的图片路径
     int [][] win={
        {1,2,3,4},
        {5,6,7,8},
        {9,10,11,12},
        {13,14,15,0}
     };

//记录步数,同意变量
    int step=0;


    //创建菜单选项下面的多个选项
    JMenuItem replayItem=new JMenuItem("重新游戏");
    JMenuItem reLoginItem=new JMenuItem("重新登录");
    JMenuItem closeItem=new JMenuItem("关闭游戏");
    //另外一个选项栏的下拉栏的功能选项
    JMenuItem accountItem=new JMenuItem("公众号");
    //构造函数
    public gameJframe(){
        initJFrame();
        initJMenuBar();
//        初始化数据
        initData();
        //初始化图片
        initImage();
        this.setVisible(true);

    }
//初始化数据（打乱数据）
    private void initData() {
//        将一个数组15位数字进行打乱
        int [] temArr={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
//定义一个随机数
        Random r=new Random();
        for(int i=0;i<temArr.length;i++){
            int index=r.nextInt(temArr.length);
            int temp=temArr[i];
            temArr[i]=temArr[index];
            temArr[index]=temp;
        }
//        给二维数组添加数据,方法一
        for(int i=0;i< temArr.length;i++){
            if(temArr[i]==0){
               x=i/4;
               y=i%4;
            }
                data[i/4][i%4]=temArr[i];
            }


    }

//初始化图片，添加图片按照二维数组的方式来进行
private void initImage() {
//        清空所有的图片
    this.getContentPane().removeAll();
//        添加一次图片后number进行++
//        int number=1;
//    判断游戏是否胜利
    if(victory()){
        JLabel winJLel=new JLabel(new ImageIcon("E:\\Java\\demo2\\image\\win.png"));
        winJLel.setBounds(203,283,197,73);
        this.getContentPane().add(winJLel);
    }
//    创建一个文字面板
    JLabel stepCount=new JLabel("步数"+step);
stepCount.setBounds(50,30,100,20);
this.getContentPane().add(stepCount);
//        适用循环来添加图片
for(int i=0;i<4;i++){
    for(int j=0;j<4;j++){
        int number=data[i][j];
        //创建一个图片ImageIcon的对象
        //创建一个JLabel的对象（管理容器）
        JLabel jLabel=new JLabel(new ImageIcon(path+number+".jpg"));
        //指定位置
        jLabel.setBounds(105*j+83,105*i+134,105,105);
//        设置图片的边框 1设置为凹进去，0是凸出来
        jLabel.setBorder(new BevelBorder(BevelBorder.LOWERED));
        //把管理容器添加到界面中
        //this.add(jLabel);
        this.getContentPane().add(jLabel);
    }
   }
//先加载恶的图片在最上面
JLabel bg=new JLabel(new ImageIcon("E:\\Java\\demo2\\image\\background.png"));
bg.setBounds(40,50,508,560);
//将背景图添加到页面中
    this.getContentPane().add(bg);
//   刷新图片
    this.getContentPane().repaint();
    }


//设置菜单页面
    private void initJMenuBar() {
        //初始化菜单
        //创建整个菜单对象
        JMenuBar jMenBar= new JMenuBar();

        //创建选项下面的两个菜单选项
        JMenu functionJMenu=new JMenu("功能");
        JMenu aboutJMenu =new JMenu("关于我们");


      //将每一个选项的条目进行添加
        functionJMenu.add(replayItem);
        functionJMenu.add(reLoginItem);
        functionJMenu.add(closeItem);

        aboutJMenu.add(accountItem);

//        给下拉栏绑定事件
        replayItem.addActionListener(this);
        reLoginItem.addActionListener(this);
        closeItem.addActionListener(this);
        accountItem.addActionListener(this);


        //将菜单里面的两个选项添加到菜单中
        jMenBar.add(functionJMenu);
        jMenBar.add(aboutJMenu);

        //设置整个菜单展示出来
        this.setJMenuBar(jMenBar);
    }



    //初始化菜单
    private void initJFrame() {
        //设置窗体的大小
        this.setSize(603,680);
        //设置基本功能
        this.setTitle("拼图单机版v1.0");
        this.setAlwaysOnTop(true);
        //设置界面居中
        this.setLocationRelativeTo(null);
        //设置关闭模式
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//     ，只有取消了次啊能按照xy的形式来添加组件
        this.setLayout(null);
//        给整个代码添加键盘监听事件
        this.addKeyListener(this);
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {
//当按压A时就会显示所有的照片
        int code=e.getKeyCode();
if(code==65){
//    清楚界面中所有的图片
    this.getContentPane().removeAll();
//    加载第一张完整的图片全部删除
    JLabel all=new JLabel(new ImageIcon(path+"all.jpg"));
    all.setBounds(83,134,420,420);
    this.getContentPane().add(all);
//加载背景图片
    JLabel bg=new JLabel(new ImageIcon("E:\\Java\\demo2\\image\\background.png"));
    bg.setBounds(40,50,508,560);
//将背景图添加到页面中
    this.getContentPane().add(bg);
//   刷新图片
    this.getContentPane().repaint();
}

    }

    @Override
    public void keyReleased(KeyEvent e) {
        if(victory()){
            return;
        }
//判断键盘按下的键码
        int code=e.getKeyCode();
        if(code==37){
            if(y==3){
                return;
            }
//            System.out.println("左");
            data[x][y]=data[x][y+1];
            data[x][y+1]=0;
            y++;
            step++;
//           继续加载初始化图片
            initImage();
        }else if(code==38){
            if(x==3){
                return;
            }
//            System.out.println("上");
            data[x][y]=data[x+1][y];
           data[x+1][y]=0;
           x++;
           step++;
//           继续加载初始化图片
           initImage();
        } else if (code==39) {
            if(y==0){
                return;
            }
            data[x][y]=data[x][y-1];
            data[x][y-1]=0;
            y--;
            step++;
//           继续加载初始化图片
            initImage();
        } else if (code==40) {
            if(x==0){
                return;
            }
            System.out.println("上");
            data[x][y]=data[x-1][y];
            data[x-1][y]=0;
            x--;
            step++;
//           继续加载初始化图片
            initImage();
        } else if (code==65) {
            initImage();
        }else if(code==87){
            data=new int [][]{
                    {1,2,3,4},
                    {5,6,7,8},
                    {9,10,11,12},
                    {13,14,15,0}
            };
            initImage();
        }


    }
    //判断data中的数据是否和win中的相同
    public boolean victory(){
for(int i=0;i< data.length;i++) {
    for (int j = 0; j < data[i].length; j++) {

        if (data[i][j] != win[i][j]) {
//            只要有一个不一样的就返回false
            return false;
        }
    }
}
return true;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
Object obj=e.getSource();
if(obj==replayItem){
    //    计步器清零
    step=0;
//   再次打乱二维数组中的数据
    initData();
//    重新加载图片
    initImage();

}else if(obj==reLoginItem){
    System.out.println("重新登录");
//    关闭游戏页面
    this.setVisible(false);
//    打开当前游戏界面
    new loginJframe();
} else if (obj==closeItem) {
    System.out.println("关闭游戏");
    System.exit(0);
} else if (obj==accountItem) {
    System.out.println("公众号");
//    创建一个弹框对象
    JDialog jDialog=new JDialog();
//创建一个管理图片的容器对象JLabel
JLabel jLabel= new JLabel(new ImageIcon("E:\\Java\\demo2\\image\\about.png"));
//设置位置和宽高
    jLabel.setBounds(0,0,258,258);
//    将图片添加到弹框中
    jDialog.getContentPane().add(jLabel);
//    给弹框设置大小
    jDialog.setSize(344,344);
//    让弹框置顶
    jDialog.setAlwaysOnTop(true);
//    让弹框据中
     jDialog.setLocationRelativeTo(null);
//     弹框不关闭则无法进行下面的界面
    jDialog.setModal(true);
//    让弹框显示出来
    jDialog.setVisible(true);
}
    }
}
